/*-*-C-*-
 * I allocate a per-MsgRec dynamic buffer to receive message expansions, which
 * must be considered private and volatile.  The size of this buffer has to be
 * specified when opening the message file with open_messagefile().  It should
 * be big enough for the longest entry in the Messages file.
 */

#include "resed.h"

static error myerror = {299, "Could not allocate memory for messages"};

/*
 * The 'longest' parameter is used to allocate the buffer for storing
 * messages in.  It must be at least as big as the longest
 * message in the messages file (after any expansion done by
 * MessageTrans_GSLookup.  Returns pointer to error block if open failed, else
 * NULL for success.
 */ 

error *message_openfile (MsgPtr msgs, char *filename, int longest)
{
    error *err;
    err = swi(MessageTrans_FileInfo, R1, filename,
              OUT,  R2, &(msgs->size),  END);
    if (err)
        return err;

    msgs->buffersize = longest;
    
    msgs->data = malloc(msgs->size);
    if (!msgs->data)
        return &myerror;
    msgs->buffer = malloc(msgs->buffersize);
    if (!msgs->buffer)
        return &myerror;
    
    err = swi(MessageTrans_OpenFile,
              R0, &(msgs->opaque),
              R1, filename,
              R2, msgs->data,  END);
    if (err)
    {
        free(msgs->data);
        free(msgs->buffer);
        msgs->data = msgs->buffer = NULL;
        msgs->size = msgs->buffersize = 0;
        return err;
    }
    else
        return NULL;
}


error * message_closefile (MsgPtr msgs)
{
    if (msgs->buffer)
        free(msgs->buffer);
    if (msgs->data)
        free(msgs->data);
    return swi(MessageTrans_CloseFile,  R0, &(msgs->opaque),  END);
}


/*
 * Simple lookup with GSTransing but no parameter substitution.
 * The pointer returned points to a malloced buffer which is
 * private to the msgs structure passed in.  That is, the caller can
 * expect the contents to remain there until the next call
 * to message_lookup() with the same msgs parameter, or until
 * message_closefile() is called.
 *
 * If there's an error, just return a pointer to the original tag.
 */

char *message_lookup (MsgPtr msgs, char *token)

{
    char *res;
                
    if (swi(MessageTrans_GSLookup,
            R0, &(msgs->opaque),
            R1, token,
            R2, msgs->buffer,
            R3, msgs->buffersize,
            OUT,  R2, &res,  END))
        return token;
    else
        return res;
}
